package znet

// iServer的接口实现 定义一个Server的服务器模块
type Server struct {
	// 服务器名称
	Name string
	// 服务器绑定的IP版本
	IPVersion string
	// 服务器监听的IP
	IP string
	// 服务器监听的端口
	Port int
}

func (s *Server) Start() {
	fmt.Println("[Start] Server Listenner at IP: %s, Port %d, is starting\n", s.IP, s.Port)
	// 1 获取一个TCP的Addr
	addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
	if err != nil {
		fmt.Println("resolve tcp addt error : ", err)
		return
	}
	// 2 监听服务器的地址
	listenner, err := net.Listen(s.IPVersion, addr)
	if err != nil {
		fmt.Println("listen", s.IPVersion, " err ", err)
		return
	}
	fmt.Println("start Zinx server succ, ", s.Name, "succ, Listenning...")

	// 3 阻塞等待客户端链接 处理客户端链接业务（读写）
	for {
		conn, err := Listenner.AcceptTCP()
		if err != nil {
			fmt.Println("Accept err : ", err)
			continue
		}
		// 已经与客户端建立链接，做一些业务 现在做最大512KB的回显业务
		go func(conn *net.) {
			for {
				buf := make([]byte, 512)
				cnt, err := conn.Read(buf)
				if err != nil {
					fmt.PRintln("recv buf err : ", err)
					continue
				}
				// 回显
				if _, err :+ conn.Write(buf[:cnt]), err != nil {
					fmt.Println("write back buf err", err)
					continue
				}
			}
		}()
	}
}

func (s *Server) Stop() {

}

func (s *Server) Serve() {

}

/* 初始化Server方法 */
func NewServer(name string) ziface.IServer {
	s := &Server{
		Name : name,
		IPVersion : "tcp4",
		IP : "0.0.0.0",
		Port : 8999,
	}
	return s
}